#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int MAXN=100050;
int n,m;
vector<int> G[MAXN];
//分解第idx个数x的质因数
void solve(int idx,int x){
    for(int i=2;i*i<=x;i++){
        while(x%i==0){
            //表示质因数i存在于第idx这个数里
            G[i].push_back(idx);
            x/=i;
        }
    }
    if(x>1){
        G[x].push_back(idx);
    }
}
//查询[l,r]中x的个数
int query(int l,int r,int x){
    //比如两个数4 6 分解之后g[2]={1,1,2} g[3]={2}表示质因数2存在的位置是第1 1 2个数
    //所以如果查询1 2 4 将4分解为两个2 所以要在g[2]里二分查找第一个大于等于l 1这个位置的
    //和第一个大于r 2这个位置的差值 即这个查询区间中该质因数的个数 如果大于等于d的该质因数
    //个数 即可以被d整除
    return upper_bound(G[x].begin(),G[x].end(),r)-lower_bound(G[x].begin(),G[x].end(),l);
}
int main(void){
    int t;
    scanf("%d",&t);
    while(t--){
        for(int i=1;i<MAXN;i++){
            G[i].clear();
        }
        scanf("%d%d",&n,&m);
        int tmp;
        for(int i=1;i<=n;i++){
            scanf("%d",&tmp);
            //不用保存原数组
            solve(i,tmp);
        }
        //printf("%d\n",query(1,2,7));
        while(m--){
            int l,r,x;
            scanf("%d%d%d",&l,&r,&x);
            bool flag=true;
            for(int i=2;i*i<=x;i++){
                int cnt=0;
                while(x%i==0){
                    cnt++;
                    x/=i;
                }
                if(cnt>query(l,r,i)){
                    flag=false;
                    break;
                }
            }
            //注意分解质因数最后剩下的数的处理
            //如果剩下一个x 那么本身就是这个质因数 所以要是1>query(l,r,x)
            if(flag && x>1 && query(l,r,x)<1){
                flag=false;
            }
            if(flag){
                printf("Yes\n");
            }
            else{
                printf("No\n");
            }
        }
    }
    return 0;
}
